package com.zhu.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    // 秘钥
    private static final String SECRET_KEY = "aaadasdasdasdasdx"; // 请替换为你自己的密钥
    // 过期时间（毫秒）
    private static final long EXPIRATION_TIME = 864000000; // 1天

    // 生成 JWT Token
    public static String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", username);
        claims.put("created", new Date());

        // 设置过期时间
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

        // 创建 JWT
        JwtBuilder builder = Jwts.builder()
                .setClaims(claims) // 设置负载
                .setExpiration(expirationDate) // 设置过期时间
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY); // 签名算法和密钥

        return builder.compact(); // 生成 JWT
    }

    // 从 JWT Token 中解析出用户名
    public static String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY) // 设置密钥
                .parseClaimsJws(token) // 解析 JWT
                .getBody();

        return claims.getSubject(); // 返回用户名
    }

    // 验证 JWT Token
    public static boolean validateToken(String token, String username) {
        String extractedUsername = getUsernameFromToken(token);
        return (extractedUsername.equals(username) && !isTokenExpired(token));
    }

    // 检查 Token 是否过期
    private static boolean isTokenExpired(String token) {
        Date expiration = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
        return expiration.before(new Date());
    }
}

